
library ieee;
use ieee.std_logic_1164.all;
use work.mystd.all;

entity procesor is 
    port (
    	clk			: in std_logic;		-- signal takta
    	reset		: in std_logic;		-- RESET signal 
        
    	ABUS		: out bus32;		-- adresna magistrala
    	DBUS		: inout bus32;		-- magistrala podataka
    	read		: out std_logic;
    	write		: out std_logic;
		
		-- rtl_synthesis off
		prekid		: out std_logic		-- signal koji signalizira simulaciji da je procesor zaustavljen
										-- ne ulazi u proces sinteze
		-- rtl_synthesis on
	); 
     
end procesor;     
        

architecture procesor of procesor is
    
    signal M1Bus : bus32;			-- interna magistrala M1
    signal M2Bus : bus32;			-- interna magistrala M2
    signal M3Bus : bus32;			-- interna magistrala M3
    
	-- PC BLOCK
	signal PCin : std_logic;		-- upravljacki signal za upis u PC
	signal PCout : std_logic;		-- upravljacki signal za postavljanje sadrzaja PC-a na M3Bus   
	signal incPC : std_logic;		-- upravljacki signal kojim se inkrementira sadrzaj registra PC

	
	-- INSTRUCTION BLOCK
	signal loadIR : std_logic;		-- upravljacki signal za upis u INSTRUCTION REGISTER sa M3Bus
	signal clrIR : std_logic;		-- upravljacki signal kojim se brise sadrzaj IR registra
	signal rdValue : bus5;			-- indeks odredisnog operanda u registarskom fajlu
	signal rs1Value : bus5;			-- indeks prvog operanda u registarskom fajlu
	signal rs2Value : bus5;			-- indeks drugog operanda u registarskom fajlu
	signal immValue : bus32;		-- neposredna vrednost 
	signal opcode : bus6;			-- opcode instrukcije
    
	-- REG BLOCK
	signal regsel1 : std_logic;		-- upravljacki signal kojim se prvi operand posatvlja na linije reg1
	signal regsel2 : std_logic;		-- upravljacki signal kojim se drugi operand postavlja na linije reg2
	signal regsel3 : std_logic;		-- upravljacki signal kojim se odredisni operand postavlja na linije reg3
	signal regIN  : std_logic;		-- upravljacki signal kojim se vrsi upis vrednost sa M3 u odredisni registar
	signal reg2M3 : std_logic;
    
	-- MEMORY INTERFACE
	signal loadMAR : std_logic;		-- upravljacki signal kojim se vrsi upis sadrzaja sa M3 u MAR
	signal outMAR : std_logic;		-- upravljacki signal za postavljanje sadrzaja MAR-a na ABUS
	signal loadMBRproc : std_logic; -- upravljacki signal kojim se vrsi upis u registar MBR odredisnog operanda iz REG bloka
	signal loadMBRmem : std_logic;	-- upravljacki signal kojim se vrsi upis sa DBUS u MBR
	signal outMBRproc : std_logic;	-- postavljanje sadrzanja registra MBR na linije M3Bus
	signal outMBRmem  : std_logic;	-- postavljanje sadrzaja registra MBR na linije DBUS
	
	-- ALU BLOCK
	signal ALUop : std_logic;		-- upravljacki signal za izvrsavanje alu operacije
	signal aluOut : std_logic;		-- signal kojim se rezultat ALU operacije postavlja na linije M3Bus
	signal interrupt : std_logic;	-- signal koji predstavlja prekid prilikom ilegalnog koda instrukcije
									-- prekoracenja adrese ili stack overflow-a
	signal branchALU : std_logic;	-- u slucaju instrukcije uslovnih skokova, predstavlja da li je uslov za skok ispunjen
	
	-- CONTROL UNIT
	signal branch : std_logic;		-- upravljacki signal za azuriranje brojaca koraka ako je dosla do skoka
	signal brop : std_logic;		-- upravljacki signal za azuriranje brojaca koraka ako se odredjuje trenutna instrukcija
	
	signal kmbranchOUT : bus8;		-- vrednost kojom treba azurirati brojac koraka
	signal kmopOUT : bus8;			-- --||--
	signal counterValue : bus8;		-- vrednost brojaca koraka
               
begin  

	PCBlock : entity work.PCBlock(PCBlock)
			port map (clk, reset, PCin, PCout, incPC, M3Bus);
			  
	instructionBlock : entity work.instructionBlock(instructionBlock)
					port map (clk, reset, M3Bus, loadIR, clrIR, rdValue, rs1Value, rs2Value, immValue, opcode );
    				   
	regBlock : entity work.regBlock(regBlock)
			port map(clk, reset, regsel1, rs1Value, regsel2, rs2Value, regsel3, rdValue, regIN, M1Bus, M2Bus, M3Bus, reg2M3);
    		   				   
	MemoryInterface : entity work.MemoryInterface(MemoryInterface)
				port map (clk, reset, loadMAR, outMAR, loadMBRproc, loadMBRmem, outMBRproc, outMBRmem, ABUS, DBUS, M3Bus);
					  
					  
	ALUBlock : entity work.ALUBlock(ALUBlock)
			port map (clk, reset, M1Bus, M2Bus, M3Bus, immValue, opcode, ALUop, aluOut, interrupt, branchALU);
    		   
	ControlUnit : entity work.ControlUnit(ControlUnit)
			port map(clk, reset, branch, brop, kmbranchOUT, kmopOUT, interrupt, opcode, counterValue, prekid);
    			  
	genSignals : entity work.genSignals(genSignals)
			port map(counterValue, PCout, loadMAR, incPC, read, loadMBRmem, loadIR, brop, 
					regsel1, ALUop, aluOut, outMBRproc, regIN, regsel3, loadMBRproc, write,
					regsel2, PCin, clrIR, outMAR, outMBRmem, reg2M3 );	
    			 		  
	KMBRANCH : entity work.KMBRANCH(KMBRANCH)
			port map(branchALU, counterValue, kmbranchOUT, branch);		
    			   			
	KMOP : entity work.KMOP(KMOP)
		port map(opcode, kmopOUT);
	
end procesor;








